import os, sys, time, datetime
import pandas as pd

def get_latest_folder(dir_path= "output"):
    ''' 从 ./output 目录中返回日期最靠前的目录。 '''
    max_date = None
    latest_file = None
    for file in os.listdir(dir_path):
        if os.path.isfile(os.path.join(dir_path, file)):
            continue
        try:
            date = datetime.datetime.strptime(file, "test_%Y%m%d_%H%M%S")
            if not max_date or date > max_date:
                max_date = date
                latest_file = file
        except (ValueError, IndexError):
            pass
    return None if not latest_file else f'./output/{latest_file}/result.csv'

# 第1个参数为需要处理的CSV文件，如果未输入则从 output目录中找最新的
input_csv = sys.argv[1] if len(sys.argv) > 1 else f'{get_latest_folder()}'

# 如果数据不存在则报错退出
if not os.path.isfile(input_csv):
    print(f'The input file "{input_csv}" does not exist.')
    sys.exit(0)

output_dir = os.path.dirname(input_csv)
output_csv = os.path.abspath(f"{output_dir}/final_result.csv")
print(f'Input:  {os.path.abspath(input_csv)}')
print(f'Output: {output_csv}')

# 加载CSV文件，共有8列： time,ordinal,type,command,size,duration,speed,fullpath
df = pd.read_csv(input_csv)

# 选择 ordinal 大于 1 的记录
df = df[df['ordinal'] > 1]

# 将 type 列使用下划线拆分成 algo 和 operation 两列，并删除 type 列
df[['algo', 'operation']] = df['type'].str.split('_', expand=True)
df.drop(columns=['type'], inplace=True)

# 按 fullpath 列对数据进行分组，计算每个组内 flesize 和 time 的平均值
#grouped_df = df.groupby('fullpath').agg({'size': 'mean', 'duration': 'mean'})

# 按 fullpath、type 和 command 列对数据进行分组，计算每个组内 size 和 duration 的平均值
grouped_df = df.groupby(['fullpath', 'algo', 'operation', 'command']).agg({'size': 'mean', 'duration': 'mean'})

# 新增 speed 列表示速度，公式为 size/duration
grouped_df['speed'] = grouped_df['size'] / grouped_df['duration']

# 输出结果到 CSV 文件
try:
    grouped_df.to_csv(output_csv)#, columns=['fullpath', 'duration'])
    print("Porcess success.")
except Exception as ex:
    print("Failed to process, reason:", ex)
